{
  //声明一个接口  
  interface ComputerType {
    color: string;
    price: number;
    screen: string;
  }

  interface Test{
    t: 1 | 2 | 3 | 4
  }

  //为接口定义一个别名
  type CT = ComputerType;

  let zjz: CT = {
    color: "深灰色",
    price: 10000,
    screen: '14inch'
  };

  //使用 type 定义联合类型的别名 简化代码
  type Week = 1 | 2 | 3 | 4 | 5 | 6 | 7;
  type Key = string | number;
  let wed: Week = 5;

  //使用 type 声明类型   相当于定义一个 Person 的接口, 但是不是定义 JS 对象
  type Person = {
    name: string;
    age: number;
    height: number;
  }

  let me: Person = {
    name: 'xxx',
    age: 18,
    height: 180
  }

  //定义一个类型 Persons 值为 Person 数组  『将来会用』
  type Persons = Person[];

  //获取某个变量的类型   这里的 typeof 是 TS 中的 typeof 不是 JS 的
  type PT = typeof me;

  // keyof ComputerType ==== 'color' | 'price' | 'screen'
  function getDataValue(data: CT, key: keyof CT){
    return data[key];
  }

  getDataValue(zjz, 'price');

  //获取函数返回值的类型
  type FT = typeof getDataValue;
  type RT = ReturnType<typeof getDataValue>;

  //获取函数参数的类型 parameter 参数
  type PAT = Parameters<typeof getDataValue>;

  let arr: PAT = [zjz, 'color'];

  //获取对象某个属性的类型   将来用的比较少, 看到之后知道是什么含义即可
  type Num = ComputerType['price'];

  //交叉类型  
  interface Friend{
    name: string;
    year: number;
  }

  interface Programer{
    program: () => void;
    language: string;
  }

  let mex: Friend & Programer = {
    name: 'xiaohigh',
    year: 20,
    program: () => {
      console.log('xxx');
    },
    language: 'js'
  }
}

{
  //变量类型的声明
  // axios.get('http://api.xiaohigh.com');

  //JS 的内容对象
  // let d: Date = new Date();

  //正则类型
  // let reg:RegExp = /520/;

  //
  let div = document.querySelector('div') as HTMLDivElement;

}
